package main

/**
用goroutine和channel协同工作完成
1、开启一个writeData协程，向管道intChan中写入50个整数
2、开启一个readData协程，从管道intChan中读取write写入的数据
注意：读写操作的同一个管道的数据，主线程需要等待读写的协程完成才能退出
*/

import (
	"fmt"
	"math/rand"
	"time"
)

var intChanFish chan int

func main() {

	intChanFish = make(chan int, 100)
	exitChan := make(chan bool, 1)
	go writeData(intChanFish)
	go readData(intChanFish, exitChan)

	// time.Sleep(time.Second)
	if <-exitChan {
		return
	}
	fmt.Println("end main")
}

// 封装两个方法
func writeData(intChan chan int) {
	rand.Seed(time.Now().UnixNano())

	for i := 1; i < 50; i++ {
		var tempInt int
		tempInt = rand.Intn(4) + 10
		fmt.Printf("写入%v,第%v次写\n", tempInt, i)
		//time.Sleep(time.Second)
		intChan <- tempInt
	}
	close(intChan) // 注意关闭通道
}

func readData(intChan chan int, exitChan chan bool) {
	var count int
	for {
		val, ok := <-intChan
		count++
		if !ok {
			break
		}
		fmt.Printf("读取到%v,第%v次读取\n", val, count)
	}
	exitChan <- true // 表示读取完毕
	close(exitChan)  // 注意关闭通道
}
